﻿using System;
using System.Collections.Generic;
using System.Text;
using System.ComponentModel;
using Sinacor.Infra.Common.Exceptions;
using Sinacor.Infra.Service.ExceptionHandling;
using Sinacor.Infra.Service.Validation;
using Sinacor.Infra.Service.Common;
using Sinacor.Servico.Bovespa.Corretagem.BusinessEntity;
using Sinacor.Servico.Bovespa.Corretagem.ResourceAccess;
using Sinacor.Infra.Service.Validation.BusinessRules;

namespace Sinacor.Servico.Bovespa.Corretagem.BusinessLogic
{
    /// <summary>
    /// Lógica de negócio
    /// </summary>
    public class FaixaComissao : BaseBusinessLogic
    {
        #region Construtor

        /// <summary>
        /// Construtor Padrão
        /// </summary>
        public FaixaComissao()
        {
        }

        #endregion

        #region Métodos

        #region AlterarFaixaComissao

        /// <summary>
        /// Altera dados de uma faixa de comissão
        /// </summary>
        /// <param name="entity">Parâmetro para alterar a faixa de comissão</param>
        public void AlterarFaixaComissao(BusinessEntity.FaixaComissao entity)
        {
            BusinessRuleValidation.ValidadorFaixaComissao validadorFaixaComissao = new BusinessRuleValidation.ValidadorFaixaComissao();
            validadorFaixaComissao.EntityToValidate = entity;

            BusinessRulesValidator validador = new BusinessRulesValidator();
            validador.AddValidation("ValidadorFaixaComissao", validadorFaixaComissao);
            validador.Validate();

            new ResourceAccess.FaixaComissao().AlterarFaixaComissao(entity);
        }

        #endregion

        #region AlterarFaixasComissoes

        /// <summary>
        /// Altera dados de diversas faixas de comissão
        /// </summary>
        /// <param name="listEntities">Parâmetros para alterar a faixa de comissão</param>
        public void AlterarFaixasComissoes(List<BusinessEntity.FaixaComissao> listEntities)
        {
            if (listEntities != null && listEntities.Count > 0)
            {
                foreach (BusinessEntity.FaixaComissao item in listEntities)
                {
                    this.AlterarFaixaComissao(item);
                }
            }
        }

        #endregion

        #region ConsultarFaixasComissoes

        /// <summary>
        /// Consulta faixas de comissão
        /// </summary>
        /// <param name="parameter">Parâmetro para consultar as faixas de comissões</param>
        /// <returns>Retorna uma lista de faixa de comissão</returns>
        public List<BusinessEntity.FaixaComissao> ConsultarFaixasComissoes(BusinessEntity.Parameter.FiltroFaixaComissao parameter)
        {
            return new ResourceAccess.FaixaComissao().ConsultarFaixasComissoes(parameter);
        }

        #endregion

        #region ExcluirFaixaComissao

        /// <summary>
        /// Exclui uma determinada faixa de comissão
        /// </summary>
        /// <param name="parameter">Parâmetro para excluir uma faixa de comissão</param>
        public void ExcluirFaixaComissao(BusinessEntity.Parameter.FiltroFaixaComissaoChave parameter)
        {
            new ResourceAccess.FaixaComissao().ExcluirFaixaComissao(parameter);
        }

        #endregion

        #region ExcluirFaixasComissoes

        /// <summary>
        /// Exclui diversas faixas de comissão
        /// </summary>
        /// <param name="listParameters">Parâmetros para excluir uma faixa de comissão</param>
        public void ExcluirFaixasComissoes(List<BusinessEntity.Parameter.FiltroFaixaComissaoChave> listParameters)
        {
            if (listParameters != null && listParameters.Count > 0)
            {
                foreach (BusinessEntity.Parameter.FiltroFaixaComissaoChave item in listParameters)
                {
                    this.ExcluirFaixaComissao(item);
                }
            }
        }

        #endregion

        #region ExecutarTransacoesFaixaComissao

        /// <summary>
        /// Executar transacões Faixa Comissao
        /// </summary>
        /// <param name="listExclusoes">Parâmetros para excluir uma faixa de comissão</param>
        /// <param name="listInclusoes">Parâmetros para incluir uma faixa de comissão</param>
        /// <param name="listAlteracoes">Parâmetros para alterar a faixa de comissão</param>
        public void ExecutarTransacoesFaixaComissao(List<BusinessEntity.Parameter.FiltroFaixaComissaoChave> listExclusoes, List<BusinessEntity.FaixaComissao> listInclusoes, List<BusinessEntity.FaixaComissao> listAlteracoes)
        {
            this.ExcluirFaixasComissoes(listExclusoes);
            this.IncluirFaixasComissoes(listInclusoes);
            this.AlterarFaixasComissoes(listAlteracoes);
        }

        #endregion

        #region IncluirFaixaComissao

        /// <summary>
        /// Inclui uma determinada faixa de comissão
        /// </summary>
        /// <param name="entity">Parâmetro para incluir uma faixa de comissão</param>
        /// <returns>Retorno o número da faixa de comissao</returns>
        public BusinessEntity.Parameter.FiltroFaixaComissaoChave IncluirFaixaComissao(BusinessEntity.FaixaComissao entity)
        {
            int? nrFaixaComissao = null;
            BusinessEntity.Parameter.FiltroFaixaComissaoChave chave = new BusinessEntity.Parameter.FiltroFaixaComissaoChave();
            ResourceAccess.FaixaComissao raFaixaComissao = new ResourceAccess.FaixaComissao();

            nrFaixaComissao = raFaixaComissao.GerarNumeroFaixaComissao();
            entity.NumeroFaixa = nrFaixaComissao;
            chave.NumeroFaixa = (nrFaixaComissao.HasValue ? nrFaixaComissao.Value : 0);

            BusinessRuleValidation.ValidadorFaixaComissao validadorFaixaComissao = new BusinessRuleValidation.ValidadorFaixaComissao();
            validadorFaixaComissao.EntityToValidate = entity;

            BusinessRulesValidator validador = new BusinessRulesValidator();
            validador.AddValidation("ValidadorFaixaComissao", validadorFaixaComissao);
            validador.Validate();

            raFaixaComissao.IncluirFaixaComissao(entity);

            return chave;
        }

        #endregion

        #region IncluirFaixasComissoes

        /// <summary>
        /// Inclui diversas faixas de comissão
        /// </summary>
        /// <param name="listEntities">Parâmetros para incluir uma faixa de comissão</param>
        public void IncluirFaixasComissoes(List<BusinessEntity.FaixaComissao> listEntities)
        {
            if (listEntities != null && listEntities.Count > 0)
            {
                foreach (BusinessEntity.FaixaComissao item in listEntities)
                {
                    this.IncluirFaixaComissao(item);
                }
            }
        }

        #endregion

        #region ObterFaixaComissao

        /// <summary>
        /// Obtém uma determinada faixa de comissão
        /// </summary>
        /// <param name="parameter">Parâmetro para obter uma determinada faixa de comissão</param>
        /// <returns>Retorna uma faixa de comissão</returns>
        public BusinessEntity.FaixaComissao ObterFaixaComissao(BusinessEntity.Parameter.FiltroFaixaComissaoChave parameter)
        {
            return new ResourceAccess.FaixaComissao().ObterFaixaComissao(parameter);
        }

        #endregion

        #endregion
    }
}